package modelo;

/*
 * esta clase es la encarga de controlar los puntos
 * y crear la nave del jugador
 */

import static modelo.SetUps.VIDAS_JUGADOR_INICIALES;
import static modelo.SetUps.PUNTOS_JUGADOR_INICIALES;
import static modelo.SetUps.X_ALGO42;
import static modelo.SetUps.Y_ALGO42;
import modelo.naves.NaveAlgo42;
import modelo.util.ContadorStopException;
import modelo.util.Vector;

public class Jugador {

	protected NaveAlgo42 algo42;
	protected PuntosSimples puntaje = new PuntosSimples(PUNTOS_JUGADOR_INICIALES);
	protected ContadorVidas vidas = new ContadorVidas (VIDAS_JUGADOR_INICIALES);
	
	public Jugador() {
		crearAlgo42();
	}
	
	private void crearAlgo42(){
		//el algo 42 se crea abajo al centro
		Vector posicion = new Vector (X_ALGO42, Y_ALGO42);
		Vector direccion = new Vector (0,-1);
		algo42 = new NaveAlgo42(posicion, direccion);
	}
	
	public NaveAlgo42 getAlgo42() {
		return (NaveAlgo42) algo42;
	}

	public int getVidas() {
		return vidas.getValor();
	}
	
	public void setVidas(int valor) {
		vidas = new ContadorVidas (valor);
	}
	
	public ContadorVidas getVidasObj() {
		return vidas;
	}
	
	public void restarUnaVida() {
		try {
			vidas.descontar();
		}
		catch (ContadorStopException e){
			throw new VidasAgotadasException();
		}
	}
	
	public int getPuntos() {
		return puntaje.getPuntos();
	}
	
	public PuntosSimples getPuntosObj() {
		return puntaje;
	}

	public void sumarPuntos(int valor) {
		puntaje.sumarPuntos(valor);
	}

	private boolean vidasAgotadas(){
		return vidas.agotado();//vidas es un contador
	}
	
	public boolean seguirJugando(){
		// si no tiene mas vidas depende de si la nave 
		// aun tiene energia
		if (vidasAgotadas()){
			return algo42.seguirActuando();
		}
		// si aun le quedan vidas puede seguir
		return true;
	}

	public void reiniciarPuntos() {
		puntaje = new PuntosSimples(PUNTOS_JUGADOR_INICIALES);
	}

	public boolean chequearNaveAlgo42() {
		if ( !algo42.seguirActuando()){
			crearAlgo42();
			restarUnaVida();
			return true;
		}
		return false;
	}
	
	public void setDirProxMov(Vector dir){
		algo42.setDirProxMov(dir);
	}
	
	public void setDisparo(){
		algo42.setDisparo();
	}
	
}
